package com.zq.server.config;

import com.github.benmanes.caffeine.cache.Caffeine;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.caffeine.CaffeineCache;
import org.springframework.cache.support.SimpleCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * 缓存配置有两种：SimpleCacheManager和CaffeineCacheManager
 * 它们配置的区别如下：
 * <p>
 * SimpleCacheManager：
 * 当应用程序启动时，通过配置多个CaffeineCache来创建多个缓存。可以为每个方法单独配置缓存过期时间。
 * <p>
 * CaffeineCacheManager：
 * 使用一个全局的Caffeine配置，来创建所有的缓存。不能为每个方法，单独配置缓存过期时间，但可以在程序启动时，
 * 全局的配置缓存，方便设置所有方法的缓存过期时间。
 * <p>
 * 总结：
 * 如果想要每个方法单独配置缓存过期时间，建议使用第一种方式。
 * 否则，你想设置全局的缓存配置，建议使用第二种方式。
 */
@EnableCaching
@Configuration
public class SimpleCaffeineConfig {


//    /**
//     * 写法一：初始化SimpleCacheManager管理器
//     * @return
//     */
//    @Bean
//    @Primary
//    public CacheManager simpleCacheManager() {
//        SimpleCacheManager cacheManager = new SimpleCacheManager();
//        ArrayList<CaffeineCache> caches = new ArrayList<>();
//        Map<String, Object> map = putCacheRule();
//        for (String name : map.keySet()) {
//            caches.add(new CaffeineCache(name, (Cache<Object, Object>) map.get(name)));
//        }
//        cacheManager.setCaches(caches);
//        return cacheManager;
//    }
//
//    /**
//     * 配置多个缓存
//     *
//     * @return
//     */
//    private static Map<String, Object> putCacheRule() {
//        Map<String, Object> map = new ConcurrentHashMap<>();
//        map.put("caffeine_test_1", Caffeine.newBuilder().recordStats()
//                .expireAfterWrite(1, TimeUnit.MINUTES)
//                .maximumSize(10000)
//                .build());
//        map.put("caffeine_test_2", Caffeine.newBuilder().recordStats()
//                .expireAfterWrite(2, TimeUnit.HOURS)
//                .maximumSize(10000)
//                .build());
//        return map;
//    }

    /**
     * 写法二：初始化SimpleCacheManager管理器
     *
     * @return
     */
    @Bean
    public CacheManager caffeineCacheManager() {
        SimpleCacheManager cacheManager = new SimpleCacheManager();
        List<CaffeineCache> caches = new ArrayList<>();
        //缓存一：失效时间是1分钟
        caches.add(new CaffeineCache("simple_caffeine_test_1",
                Caffeine.newBuilder().expireAfterWrite(1, TimeUnit.MINUTES).build()));
        //缓存二：失效时间是1小时
        caches.add(new CaffeineCache("simple_caffeine_test_2",
                Caffeine.newBuilder().expireAfterWrite(1, TimeUnit.HOURS).build()));
        cacheManager.setCaches(caches);
        return cacheManager;
    }
}